ホームに戻る
目次 :
コントロールの操作に関する制約
フォームアプリケーションなどの、コントロール(GUI)を有するアプリケーションにおいて別スレッドを起動した場合、
別スレッドからは直接コントロールを操作することはできない。
コントロールの操作はUIスレッドから行う必要がある。

UIスレッドとは
各フォームに割り当てられたスレッドで、主にイベントハンドラが属する。
即ち、コントロールの操作は原則として、当該フォームのコンストラクタとイベントハンドラ(およびそれらのサブルーチン)からに限定される。
(子フォームを起動した場合も同様。子フォーム(のスレッド)からは親フォームのコントロールを操作することはできない。)
別スレッドからのコントロールの操作
別スレッドからコントロールを操作する場合は、UIスレッドに操作を委譲する必要がある。

InvokeRequired
各コントロール(フォームを含む)にはInvokeRequiredというプロパティが存在し、Invoke() の要否( == UIスレッド外からの操作)を判定することができる。
上記のコード例を InvokeRequired を用いて書き直すと以下のようになる。これによりUIスレッド、UIスレッド外を問わず、一つの関数を共用できる。

UpdateLabelText() は自分自身をデリゲートとして渡している。(≒再帰呼び出し)